// 灯泡开关 Ⅱ
// https://leetcode.cn/problems/bulb-switcher-ii
// INLINE  ../../images/math/bulb_switcher_ii.jpeg

pub struct Solution;

impl Solution {
    pub fn flip_lights(n: i32, presses: i32) -> i32 {
        // 如果按压次数为0，那么只有一种可能性，即所有灯泡都是关闭的
        if presses == 0 {
            return 1;
        }

        // 如果只有一个灯泡，那么有两种可能性：开启和关闭
        if n == 1 {
            return 2;
        }

        // 如果只有两个灯泡，那么有特殊情况：第一次按下后，所有灯泡都会改变状态；第二次按下后，只有两个灯泡会互相切换状态
        if n == 2 {
            return if presses == 1 { 3 } else { 4 };
        }

        // 如果按压次数为1，那么有4种可能性：只有奇数编号的灯泡被切换，只有偶数编号的灯泡被切换，只有第一个和第二个灯泡被切换，只有第二个和第三个灯泡被切换
        if presses == 1 {
            4
        } else {
            // 如果按压次数为2，那么有7种可能性：只有奇数编号的灯泡被切换两次，只有偶数编号的灯泡被切换两次，只有第一个和第三个灯泡被切换两次，只有第二个和第四个灯泡被切换两次，所有灯泡都被切换两次，只有第一和第三个灯泡被切换，只有第二和第四个灯泡被切换
            if presses == 2 {
                return 7;
            }
            // 如果按压次数大于2，那么只有8种可能性：所有灯泡都被切换，只有奇数编号的灯泡被切换，只有偶数编号的灯泡被切换，只有第一个和第二个灯泡被切换，只有第二个和第三个灯泡被切换，只有第三个和第四个灯泡被切换，只有第一个和第三个灯泡被切换，只有第二个和第四个灯泡被切换
            8
        }
    }
}
